package com.dc.free.util;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.jdom2.JDOMException;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.dragonsoft.node.adapter.comm.RbspCall;
import com.dragonsoft.node.adapter.comm.RbspConsts;
import com.dragonsoft.node.adapter.comm.RbspService;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;

public class PersonUtil {

	private static Prop p = PropKit.use("person.properties");
	private static final String NODE_URL = p.get("node_url");
	private static final String SERVICE_ID = p.get("service_id");
	private static final String SENDER_ID = p.get("sender_id");
	private static final String SERVICE_DATA_OBJECT_CODE = p.get("service_data_object_code");
	//private static final String SERVICE_NAME = p.get("service_name");
	//private static final String SERVICE_URL = p.get("service_url");
	private static final String USER_NAME = p.get("user_name");
	private static final String USER_CARD_ID = p.get("user_card_id");
	private static final String USER_DEPT = p.get("user_dept");

	/**
	 * 查询常口库
	 * @param sfzh
	 * @return
	 * @param sfzh  身份证号码
	 * <ul>
	    <li>字段说明字段 类型 输入项 输出项 说明 </li>
	    <li>BDYY string 否 否 变动原因 </li>
		<li>BYQK string 否 是 兵役情况 </li>
		<li>CSD string 否 否 出生地 </li>
		<li>CSDGJ string 否 否 出生地国籍 </li>
		<li>CSDXZ string 否 是 出生地祥址 </li>
		<li>CSRQ string 是 是 出生日期 </li>
		<li>CYM string 否 是 曾用名 </li>
		<li>FWCS string 否 是 服务处所 </li>
		<li>HDQR string 否 否 何地迁入 </li>
		<li>HH string 否 否 户号 </li>
		<li>HKSZD  否 是 户口所在地 </li>
		<li>HYZK string 否 是 婚姻状况 </li>
		<li>JGGJ string 否 否 籍贯国家（地区） </li>
		<li>JGSSX string 否 是 籍贯省市县 </li>
		<li>MZ string 是 是 民族 </li>
		<li>QTZZSSXQ string 否 否 其他住址省市县(区) </li>
		<li>QTZZXZ string 否 否 其他住址详址 </li>
		<li>RYBH string 否 否 人员编号 </li>
		<li>SFZH string 是 是 身份证号 </li>
		<li>SG string 否 否 身高 </li>
		<li>WHCD string 否 是 文化程度 </li>
		<li>XB string 是 是 性别 </li>
		<li>XM string 是 是 姓名 </li>
		<li>XP  否 是 相片 </li>
		<li>YHZGX string 否 否 与户主关系 </li>
		<li>ZY string 否 否 职业 </li>
		<li>ZZSSXQ string 否 否 住址省市县(区) </li>
		<li>ZZXZ string 否 是 住址详址 </li>
	 *</ul>
	 */
	public static JSONObject query(String ... sfzhs) {
		String[] RequiredItems = new String[] { "SFZH", "XB", "MZ", "XM", "ZZXZ", "XP", "CSRQ"};
		JSONObject json = new JSONObject();
		StringBuffer condition = new StringBuffer();
		
		//优先调用舟山常口库，有数据返回结果，没有数据调用国家常口库
		
		RbspService service = new RbspService(SENDER_ID, SERVICE_ID);
		// 用户信息-必须填写系统使用者的真实身份信息
		service.setUserCardId(USER_CARD_ID);
		service.setUserDept(USER_DEPT);
		service.setUserName(USER_NAME);

		RbspCall call = service.createCall();
		call.setUrl(NODE_URL);
		call.setMethod(RbspConsts.METHOD_QUERY);

		Map<String, Object> params = new HashMap<String, Object>();
		params.put("DataObjectCode", SERVICE_DATA_OBJECT_CODE);
		params.put("InfoCodeMode", "1");
		
		for(String s: sfzhs) {
			if(condition.length() == 0) {
				condition.append("SFZH = '" + s + "'");
			} else {
				condition.append(" or SFZH = '" + s + "'");
			}
		}
		// 查询条件见接口信息-字段说明-输入项
		params.put("Condition", condition.toString());
		// 结果信息见接口信息-字段说明-输出项
		params.put("RequiredItems", RequiredItems);

		String result = call.invoke(params).replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "<?xml version=\"1.0\" encoding=\"GBK\"?>");
		try {
			return toJSON(result);
		} catch (Exception e) {
			System.out.println("全国人口库结果:" + result);
			e.printStackTrace();
			json.put("code", "1");
			json.put("msg", "数据异常，请联系管理员");
			return json;
		}
	}
	
	/**
	 * 转换json，提取有用信息
	 * @param s
	 * @return
	 * @throws JDOMException
	 * @throws IOException
	 */
	private static JSONObject toJSON(String s) throws JDOMException, IOException {
		JSONObject result = new JSONObject();
		JSONArray data = new JSONArray();
		JSONArray values = null;
		JSONObject temp = null;
		result.put("data", data);
		JSONObject json = XmlUtil.xml2JSON(s.getBytes());
		JSONArray arr = arr = json.getJSONObject("RBSPMessage").getJSONArray("Method").getJSONObject(0).getJSONArray("Items").getJSONObject(0).getJSONArray("Item").getJSONObject(0).getJSONArray("Value").getJSONObject(0).getJSONArray("Row");
		
		if(!"000".equals(arr.getJSONObject(0).getJSONArray("Data").getString(0))) {
			result.put("code", arr.getJSONObject(0).getJSONArray("Data").getString(0));
			result.put("msg", "系统错误，请联系管理员");
			return result;
		}
		
		if(arr.size() < 3) return result;
		
		JSONArray keys = arr.getJSONObject(1).getJSONArray("Data");
		for(int a=2; a< arr.size(); a++) {
			values = arr.getJSONObject(a).getJSONArray("Data");
			temp = new JSONObject();
			for(int i=0; i<keys.size(); i++) {
				temp.put(keys.getString(i).toLowerCase(), values.getString(i));
			}
			data.add(temp);
		}
		
		return result;
		
	}
	
}
